package Interface;


/**
 * Developed for NTT - All is an Entity
 *
 * @author alessandro
 */
public interface Entity {

    /**
     * Ritorna il nome dell'entity
     * @return Nome dell'entity
     */
    public String getNome();

    /**
     * Ritorna il nome della chiave primaria
     * @return Nome chiave Primaria
     */
    public String getPrymaryKeyName();

    /**
     * Ritorna sotto forma di array i nomi di tutti gli attributi dell'entity
     * @return Array dei nomi
     */
    public String[] getAllNameAttribute();

    /**
     * Ritorna sotto forma di array i nomi di tutti gli attributi dell'entity modificati dall'atto della creazione oppure modificadi da quando l'entity è stata letta da database
     * @return Array dei nomi
     */
    public String[] getAllNameAttributeModified();

    /**
     * Ritorna incapsulato in un object il valore dell'attributo chiamato tramite Attribute name
     * @param AttributeName Nome dell'attributo di cui si intende sapere il valore
     * @return Valore incapsulato in un Object
     * @throws Exception Attributo non trovato
     */
    public Object getAttributeValue(String AttributeName) throws Exception;

    /**
     * Ritorna sotto forma di stringa il valore dell'attributo chiamato tramite Attribute name
     * @param AttributeName Nome dell'attributo di cui si intende sapere il valore
     * @return Valore incapsulato in un Object
     * @throws Exception Attributo non trovato
     */
    public String getAttributeValueToString(String AttributeName) throws Exception;

    /**
     * Ritorna il tipo di un attributo chiamato per nome
     * @param AttributeName nome dell'attributo di cui si intende conoscere il tipo
     * @return tipo dell'attributo
     * @throws Exception Attributo non trovato
     */
    public String getAttributeType(String AttributeName) throws Exception;

    /**
     * Imposta il valore di un attributo chiamandolo per nome
     * @param AttributeName Nome dell'attributo da impostare
     * @param value Valore dell'attributo da impostare
     * @throws Exception Attributo non trovato, Tipo passato non compatibile con il tipo dell'attributo
     */
    public void setAttributeValue(String AttributeName, Object value) throws Exception;

    /**
     * Ritrna una stringa che vale SI se l'attributo è inseribile, NO se non è inseribile e FORCED se il suo inserimento è obbligatorio
     * @param AttributeName
     * @return Stringa contenente il tipo di inserimento
     * @throws Exception Attributo non trovato
     */
    public String getAttributeIsInserible(String AttributeName) throws Exception;

    /**
     * Ritorna sotto forma di array l'elenco di tutti i permessi di lettura dell'attributo chiamato per nome
     * @param AttributeName Nome dell'attributo
     * @return Permessi
     * @throws Exception Attributo non trovato
     */
    public String[] getAttributePermitsReading(String AttributeName) throws Exception;

    /**
     * Ritorna se un valore booleano che indica se l'attributo chiamato per nome deve essere unico o meno all'interno della base di dati TRUE = unico, FALSE = Non unico
     * @param AttributeName Nome dell'attributo
     * @return Unicità
     * @throws Exception Attributo non trovato
     */
    public boolean getAttributeIsUnique(String AttributeName) throws Exception;

    /**
     * Questo metodo confronta due l'oggetto istanziato con un altro oggetto passato per mezzo del parametro that, nel caso in cui dinamicamente questa entity è di tipo User, viene controllata anche l'ugualianza della password. TRUE = oggetti uguali, FALSE = oggetti diversi
     * @param that oggetto da confrontare
     * @return Uguaglianza
     */
    @Override
    public boolean equals(Object that);
}
